home *** CD-ROM | disk | FTP | other *** search
/ Kit PC World De Ampliacion De Windows 95 / Kit PC World de ampliacion de Windows 95.iso / internet / sweeper / samples / olecon~1 / controls / template / subclctl.cpp < prev    next >
Text File  |  1995-11-28  |  12KB  |  395 lines

  1. //=--------------------------------------------------------------------------=
  2. // <<DEFCONTROLTRUNCNAME>>Ctl.Cpp
  3. //=--------------------------------------------------------------------------=
  4. // Copyright  1995  Microsoft Corporation.  All Rights Reserved.
  5. //
  6. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF 
  7. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
  8. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A 
  9. // PARTICULAR PURPOSE.
  10. //=--------------------------------------------------------------------------=
  11. //
  12. #include "IPServer.H"
  13.  
  14. #include "Guids.H"
  15. #include "<<DEFCONTROLTRUNCNAME>>Ctl.H"
  16. #include "LocalObj.H"
  17. #include "Util.H"
  18. #include "Globals.H"
  19. #include "Resource.H"
  20.  
  21. // for ASSERT and FAIL
  22. //
  23. SZTHISFILE
  24.  
  25.  
  26. //=--------------------------------------------------------------------------=
  27. // all the events in this control
  28. //
  29. // TODO: add events here ...
  30. //
  31.  
  32. //=--------------------------------------------------------------------------=
  33. // array describing all of our property pages.  these clsids are typically
  34. // in guids.h
  35. //
  36. // TODO: add any additional property page guids here ...
  37. //
  38. const GUID *rg<<DEFCONTROLNAME>>PropPages [] = {
  39.     &CLSID_<<DEFCONTROLNAME>>GeneralPage
  40. };
  41.  
  42. //=--------------------------------------------------------------------------=
  43. // Custum Verb information
  44. //
  45. // TODO: add any custom verbs here in an array, using the VERBINFO structure.
  46. //       then mark the controld def'n in <<DEFCONTROLTRUNCNAME>>Ctl.H with
  47. //       this verb array
  48. //
  49.  
  50.  
  51. //=--------------------------------------------------------------------------=
  52. // C<<DEFCONTROLNAME>>Control::Create
  53. //=--------------------------------------------------------------------------=
  54. // global static function that creates an instance of the control an returns
  55. // an IUnknown pointer for it.
  56. //
  57. // Parameters:
  58. //    IUnknown *        - [in] controlling unknown for aggregation
  59. //
  60. // Output:
  61. //    IUnknown *        - new object.
  62. //
  63. // Notes:
  64. //
  65. IUnknown *C<<DEFCONTROLNAME>>Control::Create
  66. (
  67.     IUnknown *pUnkOuter
  68. )
  69. {
  70.     // make sure we return the private unknown so that we support aggegation
  71.     // correctly!
  72.     //
  73.     C<<DEFCONTROLNAME>>Control *pNew = new C<<DEFCONTROLNAME>>Control(pUnkOuter);
  74.     return pNew->PrivateUnknown();
  75. }
  76.  
  77. //=--------------------------------------------------------------------------=
  78. // C<<DEFCONTROLNAME>>Control::C<<DEFCONTROLNAME>>Control
  79. //=--------------------------------------------------------------------------=
  80. // "Being born is like being kidnapped.  And then sold into slavery."
  81. //    - andy warhol (1928 - 87)
  82. //
  83. // Parameters:
  84. //    IUnknown *        - [in]
  85. //
  86. // Notes:
  87. //
  88. #pragma warning(disable:4355)  // using 'this' in constructor
  89. C<<DEFCONTROLNAME>>Control::C<<DEFCONTROLNAME>>Control
  90. (
  91.     IUnknown *pUnkOuter
  92. )
  93. : COleControl(pUnkOuter, OBJECT_TYPE_CTL<<DEFCONTROLNAMECAPS>>, (IDispatch *)this)
  94. {
  95.     // initialize anything here ...
  96.     //
  97.     memset(&m_state, 0, sizeof(<<DEFCONTROLNAMECAPS>>CTLSTATE));
  98.  
  99.     // TODO: initialize anything you need to here.
  100.  
  101. }
  102. #pragma warning(default:4355)  // using 'this' in constructor
  103.  
  104. //=--------------------------------------------------------------------------=
  105. // C<<DEFCONTROLNAME>>Control::~C<<DEFCONTROLNAME>>Control
  106. //=--------------------------------------------------------------------------=
  107. // "We all labour against our own cure, for death is the cure of all diseases"
  108. //    - Sir Thomas Browne (1605 - 82)
  109. //
  110. // Notes:
  111. //
  112. C<<DEFCONTROLNAME>>Control::~C<<DEFCONTROLNAME>>Control ()
  113. {
  114.     // TODO: clean up anything here.
  115. }
  116.  
  117. //=--------------------------------------------------------------------------=
  118. // C<<DEFCONTROLNAME>>Control:RegisterClassData
  119. //=--------------------------------------------------------------------------=
  120. // register the window class information for your control here.
  121. // this information will automatically get cleaned up for you on DLL shutdown.
  122. //
  123. // Output:
  124. //    BOOL            - FALSE means fatal error.
  125. //
  126. // Notes:
  127. //
  128. BOOL C<<DEFCONTROLNAME>>Control::RegisterClassData
  129. (
  130.     void
  131. )
  132. {
  133.     WNDCLASS wndclass;
  134.  
  135.     // subclass a windows <<SUBCLASSWINDOWCLASS>> control.
  136.     //
  137.     if (!::GetClassInfo(g_hInstance, "<<SUBCLASSWINDOWCLASS>>", &wndclass))
  138.         return FALSE;
  139.  
  140.     SUBCLASSWNDPROCOFCONTROL(OBJECT_TYPE_CTL<<DEFCONTROLNAMECAPS>>) = (WNDPROC)wndclass.lpfnWndProc;
  141.     wndclass.lpfnWndProc = COleControl::ControlWindowProc;
  142.     wndclass.lpszClassName = WNDCLASSNAMEOFCONTROL(OBJECT_TYPE_CTL<<DEFCONTROLNAMECAPS>>);
  143.  
  144.     return RegisterClass(&wndclass);
  145. }
  146.  
  147. //=--------------------------------------------------------------------------=
  148. // C<<DEFCONTROLNAME>>Control::BeforeCreateWindow
  149. //=--------------------------------------------------------------------------=
  150. // called just before the window is created.  Great place to set up the
  151. // window title, etc, so that they're passed in to the call to CreateWindowEx.
  152. // speeds things up slightly.
  153. //
  154. // Notes:
  155. //
  156. void C<<DEFCONTROLNAME>>Control::BeforeCreateWindow
  157. (
  158.     void
  159. )
  160. {
  161.     // TODO: users should modify m_dwWindowStyle, m_dwWindowStyleEx, m_szWindowTitle
  162.     // et al here so that the call to createwindow has as much information as
  163.     // possible.
  164.     // if you don't use this function, then you can probably just remove it.
  165.     //
  166.     m_szWindowTitle = "<<DEFCONTROLNAME>>";
  167. }
  168.  
  169. //=--------------------------------------------------------------------------=
  170. // C<<DEFCONTROLNAME>>Control::InternalQueryInterface
  171. //=--------------------------------------------------------------------------=
  172. // qi for things only we support.
  173. //
  174. // Parameters:
  175. // Parameters:
  176. //    REFIID        - [in]  interface they want
  177. //    void **       - [out] where they want to put the resulting object ptr.
  178. //
  179. // Output:
  180. //    HRESULT       - S_OK, E_NOINTERFACE
  181. //
  182. // Notes:
  183. //
  184. HRESULT C<<DEFCONTROLNAME>>Control::InternalQueryInterface
  185. (
  186.     REFIID  riid,
  187.     void  **ppvObjOut
  188. )
  189. {
  190.     IUnknown *pUnk;
  191.  
  192.     *ppvObjOut = NULL;
  193.  
  194.     // TODO: if you want to support any additional interrfaces, then you should
  195.     // indicate that here.  never forget to call COleControl's version in the
  196.     // case where you don't support the given interface.
  197.     //
  198.     if (DO_GUIDS_MATCH(riid, IID_I<<DEFCONTROLNAME>>)) {
  199.         pUnk = (IUnknown *)(I<<DEFCONTROLNAME>> *)this;
  200.     } else{
  201.         return COleControl::InternalQueryInterface(riid, ppvObjOut);
  202.     }
  203.  
  204.     pUnk->AddRef();
  205.     *ppvObjOut = (void *)pUnk;
  206.     return S_OK;
  207. }
  208.  
  209. //=--------------------------------------------------------------------------=
  210. // C<<DEFCONTROLNAME>>Control::LoadTextState
  211. //=--------------------------------------------------------------------------=
  212. // load in our text state for this control.
  213. //
  214. // Parameters:
  215. //    IPropertyBag *        - [in] property bag to read from
  216. //    IErrorLog *           - [in] errorlog object to use with proeprty bag
  217. //
  218. // Output:
  219. //    HRESULT
  220. //
  221. // Notes:
  222. //    - NOTE: if you have a binary object, then you should pass an unknown
  223. //      pointer to the property bag, and it will QI it for IPersistStream, and
  224. //      get said object to do a Load()
  225. //
  226. STDMETHODIMP C<<DEFCONTROLNAME>>Control::LoadTextState
  227. (
  228.     IPropertyBag *pPropertyBag,
  229.     IErrorLog    *pErrorLog
  230. )
  231. {
  232.     // TODO: implement your text load code here.
  233.     //
  234.     return S_OK;
  235. }
  236.  
  237. //=--------------------------------------------------------------------------=
  238. // C<<DEFCONTROLNAME>>Control::LoadBinaryState
  239. //=--------------------------------------------------------------------------=
  240. // loads in our binary state using streams.
  241. //
  242. // Parameters:
  243. //    IStream *            - [in] stream to write to.
  244. //
  245. // Output:
  246. //    HRESULT
  247. //
  248. // Notes:
  249. //
  250. STDMETHODIMP C<<DEFCONTROLNAME>>Control::LoadBinaryState
  251. (
  252.     IStream *pStream
  253. )
  254. {
  255.     // TODO: implement your binary load code here.  to prevent this from being
  256.     // a massive performance sink, you should probably try to organize your
  257.     // properties in such a way that enables you to do just one IStream::Read
  258.     // in the LoadBinaryState function.  fast is good.
  259.     //
  260.     return S_OK;
  261. }
  262.  
  263. //=--------------------------------------------------------------------------=
  264. // C<<DEFCONTROLNAME>>Control::SaveTextState
  265. //=--------------------------------------------------------------------------=
  266. // saves out the text state for this control using a property bag.
  267. //
  268. // Parameters:
  269. //    IPropertyBag *        - [in] the property bag with which to work.
  270. //    BOOL                  - [in] if TRUE, then write out ALL properties, even
  271. //                            if they're their the default value ...
  272. //
  273. // Output:
  274. //    HRESULT
  275. //
  276. // Notes:
  277. //
  278. STDMETHODIMP C<<DEFCONTROLNAME>>Control::SaveTextState
  279. (
  280.     IPropertyBag *pPropertyBag,
  281.     BOOL          fWriteDefaults
  282. )
  283. {
  284.     // TODO: implement your text save code here.
  285.     //
  286.     return S_OK;
  287. }
  288.  
  289. //=--------------------------------------------------------------------------=
  290. // C<<DEFCONTROLNAME>>Control::SaveBinaryState
  291. //=--------------------------------------------------------------------------=
  292. // save out the binary state for this control, using the given IStream object.
  293. //
  294. // Parameters:
  295. //    IStream  *             - [in] save to which you should save.
  296. //
  297. // Output:
  298. //    HRESULT
  299. //
  300. // Notes:
  301. //    - it is important that you seek to the end of where you saved your
  302. //      properties when you're done with the IStream.
  303. //
  304. STDMETHODIMP C<<DEFCONTROLNAME>>Control::SaveBinaryState
  305. (
  306.     IStream *pStream
  307. )
  308. {
  309.     // TODO: implement your binary save state code here.  to prevent this from being
  310.     // a massive performance sink, you should probably try to organize your
  311.     // properties in such a way that enables you to do just one IStream::Read
  312.     // in the LoadBinaryState function.  fast is good.
  313.     //
  314.     return S_OK;
  315. }
  316.  
  317.  
  318. //=--------------------------------------------------------------------------=
  319. // C<<DEFCONTROLNAME>>Control::OnDraw
  320. //=--------------------------------------------------------------------------=
  321. // "I don't very much enjoy looking at paintings in general.  i know too
  322. //  much about them.  i take them apart."
  323. //    - georgia o'keeffe (1887-1986)
  324. //
  325. // Parameters:
  326. //    HDC                - [in]  HDC to draw to
  327. //    LPCRECTL           - [in]  rect we're drawing to
  328. //    LPCRECTL           - [in]  window extent and origin for meta-files
  329. //    HDC                - [in]  HIC for target device
  330. //
  331. // Output:
  332. //    HRESULT
  333. //
  334. // Notes:
  335. //
  336. HRESULT C<<DEFCONTROLNAME>>Control::OnDraw
  337. (
  338.     HDC      hdcDraw,
  339.     LPCRECTL prcBounds,
  340.     LPCRECTL prcWBounds,
  341.     HDC      hicTargetDevice
  342. )
  343. {
  344.     // TODO: put your drawing code here ...
  345.     //
  346.     return DoSuperClassPaint(hdcDraw, prcBounds);
  347. }
  348.  
  349. //=--------------------------------------------------------------------------=
  350. // C<<DEFCONTROLNAME>>Control::WindowProc
  351. //=--------------------------------------------------------------------------=
  352. // window procedure for this control.  nothing terribly exciting.
  353. //
  354. // Parameters:
  355. //     see win32sdk on window procs.
  356. //
  357. // Notes:
  358. //
  359. LRESULT C<<DEFCONTROLNAME>>Control::WindowProc
  360. (
  361.     HWND   hwnd,
  362.     UINT   msg,
  363.     WPARAM wParam,
  364.     LPARAM lParam
  365. )
  366. {
  367.     // TODO: handle any messages here, like in a normal window
  368.     // proc.  note that for special keys, you'll want to override and
  369.     // implement OnSpecialKey.
  370.     //
  371.     return CallWindowProc((FARPROC)SUBCLASSWNDPROCOFCONTROL(OBJECT_TYPE_CTL<<DEFCONTROLNAMECAPS>>), hwnd, msg, wParam, lParam);
  372. }
  373.  
  374. //=--------------------------------------------------------------------------=
  375. // C<<DEFCONTROLNAME>>Control::AboutBox
  376. //=--------------------------------------------------------------------------=
  377. // prints up an about box.  fweeeee.
  378. //
  379. // Notes:
  380. //
  381. void C<<DEFCONTROLNAME>>Control::AboutBox
  382. (
  383.     void
  384. )
  385. {
  386.     // TODO: Ideally, one would use DialogBox, and some sort of Dialog Box here if
  387.     // they wanted a slightly more interesting About Box ...  you should
  388.     // still call ModalDialog first, however.
  389.     //
  390.     ModalDialog(TRUE);
  391.     MessageBox(NULL, "This is My Control", "About <<DEFCONTROLNAME>>", MB_OK | MB_TASKMODAL);
  392.     ModalDialog(FALSE);
  393. }
  394.  
  395.